package m.common.action;

import m.system.exception.MException;
import m.system.util.JSONMessage;
import m.system.util.NumberUtil;
import m.system.util.StringUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

public abstract class ImportExcelAction extends Action {
	private String importParam;
	/** 子类继承
	 * 处理上传文件的数据
	 *  data 数据
	 *  处理成功消息
	 *  Exception 错误信息
	 */
	protected String processImportData(List<String[]> data,String importParam) throws Exception{
		throw new MException(this.getClass(), "未实现导入方法");
	}

	/** 子类继承
	 * 上传页面打开时获取设置信息
	 * {
	 * 	importParam, //可修改打开页面时的importParam
	 * 	tempPath,	//模板路径 站点根目录开始
	 * 	tempName,	//模板文件名
	 * 	tempType,	//模板类型 默认download下载 page站内打开 open新页面打开
	 * 	title,	//导入页面标题
	 * 	subTitle,	//导入页面子标题
	 * 	alertMessage	//提示消息
	 * }
	 */
	protected JSONMessage processImportSetting(String importParam){
		return new JSONMessage();
	}
	public JSONMessage getImportExcelSetting(){
		return processImportSetting(importParam);
	}
	/**
	 * action 导入方法
	 * 
	 */
	public JSONMessage importExcel(){
		JSONMessage message=new JSONMessage();
		Workbook work=null;
		FileInputStream is=null;
		try {
			List<String[]> list= new ArrayList<>();
			Map<String,File> fileMap=getFileMap();
			if(fileMap.size()==0) throw new MException(this.getClass(),"没有接收到Excel文件");
			for(String key : fileMap.keySet()){
				File file=fileMap.get(key);
				is=new FileInputStream(file);
				if (file.getName().endsWith(".xls")) {
					work = new HSSFWorkbook(is);
				} else if (file.getName().endsWith(".xlsx")) {
					work = new XSSFWorkbook(is);
				} else {
					throw new Exception("请选择xls或者xlsx文件");
				}
				Sheet sheet = work.getSheetAt(0);
				for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {
					Row row=sheet.getRow(i);
					int cells=row.getLastCellNum();
					if(cells<0) continue;
					String[] strs=new String[cells];
					for (int j = 0; j < cells; j++) {
						Cell cell = row.getCell(j);
						strs[j]=getCellValue(cell);
					}
					list.add(strs);
				}
			}
			if(list.size()<1) throw new Exception("Excel文件中没有数据!");
			message.push("msg", processImportData(list,importParam));
			message.push("code",0);
		} catch (Exception e) {
			e.printStackTrace();
			message.push("msg", e.getMessage());
			message.push("code",1);
		}finally{
			try {
				if(null!=work) work.close();
			} catch (IOException ignored) {}
			try {
				if(null!=is) is.close();
			} catch (IOException ignored) {}
		}
		//SystemUtil.println(message.toJSONString());
		return message;
	}

	private static String getCellValue(Cell cell) {
		if(null==cell) return null;
		CellType cellType = cell.getCellType();
		String cellValue = null;
		if (cellType == CellType._NONE) {
		} else if (cellType == CellType.NUMERIC) {
			// 数值型
			if (DateUtil.isCellDateFormatted(cell)) {
				// 日期类型
				Date d = cell.getDateCellValue();
				cellValue = m.system.util.DateUtil.format(d,"yyyy-MM-dd HH:mm:ss");
			} else {
				cellValue = NumberUtil.format(cell.getNumericCellValue(), "0.#######");
			}
		} else if (cellType == CellType.STRING) {
			// 字符串型
			cellValue = cell.getStringCellValue();
		} else if (cellType == CellType.FORMULA) {
			// 公式型
			try {
				cellValue = cell.getStringCellValue();
			} catch (IllegalStateException e) {
				cellValue = NumberUtil.format(cell.getNumericCellValue(), "0.#######");
			}
		} else if (cellType == CellType.BLANK) {
			// 空值
		} else if (cellType == CellType.BOOLEAN) {
			// 布尔型
			cellValue = String.valueOf(cell.getBooleanCellValue());
		} else if (cellType == CellType.ERROR) {
			// 错误
			cellValue = String.valueOf(cell.getErrorCellValue());
		}
		return null!=cellValue?cellValue.trim():null;
	}

	/**
	 * 转换行数组长度
	 */
	protected String[] parseRowData(String[] row,int length){
		String[] data=new String[length];
		System.arraycopy(row, 0, data, 0, row.length);
		return data;
	}
	/**
	 * 转换double类型
	 *  str 
	 *  row 行号
	 *  errorMessage 错误消息容易
	 * 
	 */
	protected Double parseDouble(String str,int row,String name,StringBuffer errorMessage) {
		if(StringUtil.isSpace(str)){
			return null;
		}
		try{
			return Double.parseDouble(str);
		}catch(NumberFormatException e){
			errorMessage.append("\r\n第").append(row).append("行").append(name).append("数字格式化出错！错误值：").append(str);
		}
		return null;
	}
	/**
	 * 转换Integer类型
	 *  str 
	 *  row 行号
	 *  errorMessage 错误消息容易
	 * 
	 */
	protected Integer parseInteger(String str,int row,String name,StringBuffer errorMessage) {
		if(StringUtil.isSpace(str)){
			return null;
		}
		try{
			return Integer.parseInt(str);
		}catch(NumberFormatException e){
			errorMessage.append("\r\n第").append(row).append("行").append(name).append("整型格式化出错！错误值：").append(str);
		}
		return null;
	}
	/**
	 * 转换Date类型
	 *  str 
	 *  pattern 时间格式 
	 *  row 行号
	 *  errorMessage 错误消息容易
	 * 
	 */
	protected Date parseDate(String str,int row,String name,StringBuffer errorMessage) {
		if(StringUtil.isSpace(str)){
			return null;
		}
		try{
			return m.system.util.DateUtil.format(str, "yyyy-MM-dd HH:mm:ss");
		}catch(NumberFormatException e){
			errorMessage.append("\r\n第").append(row).append("行").append(name).append("日期时间格式化出错！错误值：").append(str);
		}
		return null;
	}

	/**
	 * 转换字符串，空字符串转换成null
	 */
	protected String parseString(String str){
		if(StringUtil.isSpace(str)){
			return null;
		}
		return str;
	}

	public String getImportParam() {
		return importParam;
	}

	public void setImportParam(String importParam) {
		this.importParam = importParam;
	}
}
